/**
 * @file label.h
 * @brief Fichier d'entête du module label.
 *
 * @author Rachid Delory, Mamadou Keita, Florian Bernard
 */

#ifndef H_LABEL_H
#define H_LABEL_H

/* *********************************************************************

                       Librairies de label                           

********************************************************************* */

#include <stdlib.h>
#include <stdio.h>
#include <stddef.h>
#include "utilitaireString.h"

/* *********************************************************************

                        Définitions de types                           

********************************************************************* */

/**
 * @struct sLabel
 * @brief Structure utilisée pour la gestion des Label
 *
 * Cette structure est utilisée pour gérer un Label. Les champs de cette structure doivent être modifiés ou lus par les accesseurs et mutateurs. Ils doivent être initialisés et libérés avec les fonctions prévus à cette effet
 */
struct sLabel {
	unsigned int id; /** */
	char * libelle; /** */
  char maj;
  char sup;
};
/**
 * @typedef Label
 * @brief Redéfinit la structure sLabel
 */
	typedef struct sLabel Label;

/* *********************************************************************

           Fonctions de la structure Label          

********************************************************************* */

/**
 * @fn Label * creer_Lab() ;
 * @brief Crée une label dans le tas
 *
 * @return un pointeur sur Label
 */
Label * creer_Lab();

/**
 * @fn void init_Lab(Label * label);
 * @brief Initilise une label
 *
 * @param[in,out] Label pointeur sur Label
 */
void init_Lab(Label * label);

/**
 * @fn void liberer_Lab(Label * label);
 * @brief Libère la label
 *
 * @param[in,out] label pointeur sur Label
 */
void liberer_Lab(Label * label);

/**
 * @fn void detruire_Lab(Label ** label);
 * @brief Détruis une label du tas
 * 
 * @param[in,out] label pointeur sur Label
 */
void detruire_Lab(Label ** label);

/**
 * @fn void copier_Lab(Label *dest, const Label *src);
 * @brief Copie dans dest le Label src
 *
 * @param[in,out] dest contiendra les mêmes infor que src
 * @param src
 */
void copier_Lab(Label **dest, const Label *src);

/* *********************************************************************

           Accesseurs et Mutateurs de la structure Label               

********************************************************************* */

/**
 * @fn unsigned int getId_Lab(const Label * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Label
 * @return unsigned int
 */
unsigned int getId_Lab(const Label * ptr) ;

/**
 * @fn void setId_Lab(Label *ptr, const unsigned int val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Label.
 * @param val.
 */
void setId_Lab(Label *ptr, const unsigned int val) ;

/**
 * @fn char * getLibelle_Lab(const Label * ptr) ;
 * @brief 
 *
 * @param ptr pointeur vers Label
 * @return char *
 */
char * getLibelle_Lab(const Label * ptr) ;

/**
 * @fn void setLibelle_Lab(Label *ptr, const char * val) ;
 * @brief Modifie .
 *
 * @param[in,out] ptr Pointeur vers Label.
 * @param val.
 */
void setLibelle_Lab(Label *ptr, const char * val) ;

/**
 * @fn void setMaj_Lab(Label *ptr, const char b);
 * @brief Set le besoin de faire une mise à jour, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setMaj_Lab(Label *ptr, const char b);

/**
 * @fn char getMaj_Lab(const Label *ptr);
 * @brief Retourne 0 si pas besoin de faire la mise à jour, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getMaj_Lab(const Label *ptr);

/**
 * @fn void setSup_Lab(Label *ptr, const char b);
 * @brief Set le besoin de le supprimer, ou pas
 * 
 * @param[in,out] ptr
 * @parm b
 */
void setSup_Lab(Label *ptr, const char b);

/**
 * @fn char getSup_Lab(const Label *ptr);
 * @brief Retourne 0 si pas besoin de le supprimer, et 1 sinon
 *
 * @param ptr
 * @return Comme un boolean
 */
char getSup_Lab(const Label *ptr);
#endif
